Elasticsearch QueryString 查詢語法筆記
TLDR
query_string是基於 Lucene 的查詢語法,適合快速檢索。- 英文運算子(AND, OR, NOT)必須大寫。
- 針對
keyword欄位或數值/日期/布林欄位進行多詞搜尋時,必須使用雙引號或OR運算子,否則會因無法拆分而查不到資料。 - 比較運算子(
>,>=,<,<=)在搭配fields參數時會報錯,應改用範圍查詢語法([x TO y])。 - 日期查詢若包含冒號(如標準 ISO 格式),必須使用雙引號包覆。
- 日期欄位不支援比較運算子,請一律使用範圍查詢語法。
- 模糊搜尋(
~)與近似搜尋(~N)的參數設定,會被查詢字串中的具體值覆蓋。 - 欄位加權(
^)與查詢層級boost參數作用範圍不同,前者影響欄位間相對權重,後者影響複合查詢中子句的權重。
基本 API 結構
在 Elasticvue 或 Kibana Discover 等工具中,query_string 提供了一種比 DSL 更簡潔的查詢方式。
json
{
"query": {
"query_string": {
"query": "your query string here",
"default_field": "content",
"default_operator": "OR"
}
},
"size": 10,
"from": 0,
"sort": []
}查詢語法與欄位型別限制
什麼情況下會遇到這個問題:當你對 keyword 或數值欄位進行多詞查詢時,常會發現查不到資料。
Elasticsearch 對不同欄位型別有不同的分析策略。query_string 會依據目標欄位型別選擇處理方式:
- text 欄位:使用 standard 分析器,會分詞並轉小寫。
- keyword 欄位:保持完整字串不變。
- 數值/日期/布林欄位:不使用分析器,索引原始值。
| 欄位類型 | 查詢字串 | 行為說明 |
|---|---|---|
| text | apple banana | 等同 apple OR banana |
| keyword | apple banana | 查不到(被視為完整字串比對) |
| 數值/日期 | 123 456 | 查不到(不會自動拆分) |
解決方案:針對 keyword 或數值欄位,請使用雙引號明確指定或使用 OR 運算子:
json
{
"query": {
"query_string": {
"query": "\"apple\" \"banana\""
}
}
}範圍查詢與比較運算子
什麼情況下會遇到這個問題:當你嘗試使用 fields 參數並搭配比較運算子(如 price:>=10)時,查詢會失敗。
比較運算子(>、>=、<、<=)在搭配 fields 陣列參數時會產生錯誤。
建議做法:改用範圍查詢語法([x TO y]),此語法與 fields 參數完全相容。
json
{
"query": {
"query_string": {
"query": "[10 TO *]",
"fields": ["price"]
}
}
}日期時間查詢注意事項
什麼情況下會遇到這個問題:當你使用標準日期格式(包含冒號)或嘗試對日期欄位使用比較運算子時。
- 格式限制:標準格式(如
2023-01-15T08:30:00Z)包含冒號,必須使用雙引號包覆,否則會解析錯誤。 - 比較運算子限制:日期欄位不支援比較運算子,若使用會導致查詢失效或報錯。
正確做法:一律使用範圍查詢語法。
json
{
"query": {
"query_string": {
"query": "timestamp:[2023-01-15T08:30:00Z TO *]"
}
}
}權重控制:Boost 與欄位加權
什麼情況下會遇到這個問題:當你需要調整搜尋結果的排序權重時。
- 欄位加權(Field Boost):使用
^語法。例如title^3表示該欄位的基礎分數會被放大 3 倍。 - 查詢層級 Boost:使用
boost參數。主要用於bool查詢中的should子句,調整不同查詢條件的相對重要性。
關鍵差異:
- 欄位加權作用於單一查詢內的不同欄位。
- 查詢 boost 作用於複合查詢中的不同子句。
- 若單獨使用一個查詢,
boost參數對排序沒有影響。
模糊搜尋與近似搜尋
什麼情況下會遇到這個問題:當你設定了全域 fuzziness 或 phrase_slop 參數,卻發現查詢結果不符合預期。
波浪號 ~ 的用途取決於位置:
- 單詞後(模糊搜尋):處理拼寫錯誤。
fuzziness參數必須搭配查詢字串中的~才會生效。 - 片語後(近似搜尋):處理詞序與距離。
phrase_slop控制詞彙移動的最小步數。
重要規則:查詢字串中明確設定的值(如 apple~2)會覆蓋 API 參數中的全域設定。
異動歷程
- 2025-04-13 初版文件建立。
- 2025-10-03
- 修正語句用詞,統一使用台灣慣用語。
- 修正日期查詢範圍語法說明(日期欄位不支援比較運算子,應使用範圍查詢語法)。
- 修正權重計算遺漏欄位基礎分數的部分。
- 補充技術細節。
